#include <bits/stdc++.h>
// #define int long long
#define ll long long
#define rr register
using namespace std;
// 对01trie树做扫描线
// 01tire的节点需维护：
// 其左右子节点位置、该点是否为end、该点为根的子树中end的数量
// 若子结点为空则位置为0，0号节点的end为否，end数量为0
// dfs时若某点为end，则将其投放入子结点中深度低的那一方
// 最后dfs时若无左右节点则结算ans并结束
struct point
{
    int son[2];
    int ed;
    int dp;
    int ndp;
} tr[signed(4e6)];
inline int in(int a, int b)
{
    return tr[a].ndp > tr[b].ndp ? b : a;
}
inline int ax(int a, int b)
{
    return in(a, b) == a ? b : a;
}
#define up(n) ((n > double(int(n))) ? int(n + 1) : int(n))
int cnt = 1;
int n;
string s;
ll ans;
void dp(int lc)
{
    if (lc == 0)
        return;
    dp(tr[lc].son[0]), dp(tr[lc].son[1]);
    if (tr[lc].son[0] == 0 || tr[lc].son[1] == 0)
    { // 没满两个子结点，说明该点可延伸出新的子结点
        tr[lc].ndp = tr[lc].dp;
        if (tr[lc].ed)
            tr[lc].ndp++; // 确保不会优先选择end
        return;
    }
    // 满了两个子结点，则取子结点的最小值
    tr[lc].ndp = min(tr[tr[lc].son[0]].ndp, tr[tr[lc].son[1]].ndp);
}
void build()
{ // 加入新元素
    rr int lc = 1;
    for (rr int i = 0; i < s.size(); i++)
    {
        if (tr[lc].son[s[i] - '0'] != 0)
            lc = tr[lc].son[s[i] - '0'];
        else
            tr[lc].son[s[i] - '0'] = ++cnt, tr[cnt].dp = tr[lc].dp + 1, lc = cnt;
    }
    tr[lc].ed++;
}
inline int qpow(int base, int ts)
{ // 快速幂
    int rt = 1;
    while (ts)
    {
        if (ts & 1)
            rt *= base;
        base *= base;
        ts >>= 1;
    }
    return rt;
}
void dfs(int lc)
{
    if (tr[lc].son[0] == 0 && tr[lc].son[1] == 0 && tr[lc].ed == 0)
    { // 为唯一叶节点，说明不需要延伸
        tr[lc].ed++;
        return;
    }
    if (tr[lc].son[0] == 0)
    { // 没有0号子节点
        tr[lc].son[0] = ++cnt;
        tr[tr[lc].son[0]].dp = tr[lc].dp + 1;
        tr[tr[lc].son[0]].ndp = tr[lc].dp + 2;
        tr[tr[lc].son[0]].ed = 1;
        goto back;
    }
    if (tr[lc].son[1] == 0)
    { // 没有1号子节点
        tr[lc].son[1] = ++cnt;
        tr[tr[lc].son[1]].dp = tr[lc].dp + 1;
        tr[tr[lc].son[1]].ndp = tr[lc].dp + 2;
        tr[tr[lc].son[1]].ed = 1;
        goto back;
    }
    // 有两个子结点
    dfs(in(tr[lc].son[0], tr[lc].son[1])); // 向叶节点
back:
    ans++;
    tr[lc].ndp = min(tr[tr[lc].son[0]].ndp, tr[tr[lc].son[1]].ndp);
    while (tr[lc].ed)//处理好原本为叶节点但现在不是的end
        tr[lc].ed--, dfs(lc);
}
void sol(int lc)
{ // 从叶向根遍历，发现需要延长的点时调用上一个函数
    if (lc == 0)
        return;
    sol(tr[lc].son[0]), sol(tr[lc].son[1]);
    // 先遍历再判断以确保遍历顺序
    if (tr[lc].ed)
        tr[lc].ed--, dfs(lc);
}
// #define test
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#ifdef test
    freopen("/home/hp/桌面/haha/contest/CQYC/2025/11/12/1/down/id/id4.in", "r", stdin);
#else
    freopen("id.in", "r", stdin);
    freopen("id.out", "w", stdout);
#endif
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> s, build();
    dp(1);
    sol(1);
    cout << ans;
}
